package content
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	import flash.geom.Matrix;

	public class List extends MovieClip
	{
		private var _allCell:Sprite;
		private var _modelItem:Array;
		private var _maskMc:Sprite;
		private var _canChange:Boolean=true
		private var _listScroll:ListScroll;
		private var _willCopyId:uint=0;
		private var _willCopyIdItem:Array;

		public function List()
		{
			_allCell=new Sprite();
			addChild(_allCell);
			addMaskMc();
			addScroll();
			addEvents();
		}

		private function addEvents():void
		{
			UiManege.stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
		}

		protected function onKeyDown(event:KeyboardEvent):void
		{

			if (event.keyCode == 68 && event.ctrlKey) //ctrl+d
			{
				_willCopyId=0;
				var tempModelVo:ModelVO=getSelectModelVoID();
				if(tempModelVo)
				{
					_willCopyId=tempModelVo.id;
				}
				trace("准备复制",_willCopyId);

			}
			if (event.keyCode == 84 && event.ctrlKey)//ctrl+t
			{
				pasteFiles();
			}
		}
		private function getSelectModelVoID():ModelVO
		{
			for (var i:int=0; i < _modelItem.length; i++)
			{
				var tempModelVo:ModelVO=_modelItem[i];
				if (tempModelVo.select)
				{
					return tempModelVo;
				}
			}
			return null;
		}
		
		
		
		private  function pasteFiles():void
		{
			if(_willCopyId==0)return;
			
			var toModelVo:ModelVO=getSelectModelVoID();
			if(toModelVo==null||(toModelVo.id==_willCopyId)||toModelVo.filetype!=1){
				trace("不可复制");
				return ;
			}
			var k:Boolean=isItSonAndCamMove(_willCopyId,toModelVo.id);
			if(!k){
				trace("不给向下复制");
				return ;
			}

			_willCopyIdItem=new Array;
			_willCopyIdItem.push(_willCopyId);
			getPasteFlesRoot(_willCopyId);
			
			//生存一组新的。要变换的ID出来，这样可以整体复制作;  
			var  newIdItem:Array=new Array;
			for(var i:int=0;i<_willCopyIdItem.length;i++)
			{
				var getID:uint=getRandomNewId(); //得到一个随新可用新的ID
				//再判断是否生存过了
				while(true){
					var canUseId:Boolean=true;
					for(var j:uint=0;j<newIdItem.length;j++){
						if(newIdItem[j]==getID){
							canUseId=false;
							getID=getRandomNewId()//不可用的情况下请求一个新的，;
						}
					}
					if(canUseId){
						break;
					}
				}
				newIdItem.push(getID);
			}
			
			makeNewFileArray(_willCopyIdItem,newIdItem,toModelVo.id)
		}
		private function makeNewFileArray(oldArr:Array,newArr:Array,toId:uint):void
		{
			trace(oldArr);
			trace(newArr);
			trace(toId);
			
			var addModelvoItem:Array=new Array;
			
			for(var i:uint=0;i<oldArr.length;i++){
				var tempVo:ModelVO=getModelVobyID(oldArr[i]);
				if(tempVo==null)return;
				var newModelVo:ModelVO=tempVo.clone();
				newModelVo.id=newArr[i]//换新的ID;
			    //找到新的Fartheid
				var haveFatherID:Boolean=false;
				for(var j:uint=0;j<oldArr.length;j++){
					if(newModelVo.father==oldArr[j]){
						//换成新的ID
						haveFatherID=true;
						newModelVo.father=newArr[j]
					}
				}
				if(haveFatherID==false){
					newModelVo.father=toId; //没有换的，那就说明是要复制去的地方
				}
				trace(newModelVo.id,newModelVo.father);
				var tempCell:Cell=new Cell;
				tempCell.source=newModelVo;
				newModelVo.cell=tempCell;
				_modelItem.push(newModelVo)
				_allCell.addChild(tempCell);

			}
			changePasition();
		}
		private function getModelVobyID(id:uint):ModelVO
		{
			for (var i:int=0; i < _modelItem.length; i++)
			{
				var tempModelVo:ModelVO=_modelItem[i];
				if(tempModelVo.id==id){
					return tempModelVo;
				}
			}
			return null;
		}
		
		private function getPasteFlesRoot(id:uint):void
		{//获得报有要COPY的MODEVO;
			for (var i:int=0; i < _modelItem.length; i++)
			{
				var tempModelVo:ModelVO=_modelItem[i];
				if(tempModelVo.father==id){
					_willCopyIdItem.push(tempModelVo.id);
					getPasteFlesRoot(tempModelVo.id);
				}
			}
			
		}
		

		public function get listScroll():ListScroll
		{
			return _listScroll;
		}

		private function addScroll():void
		{
			_listScroll=new ListScroll(_allCell, _maskMc)
			addChild(_listScroll);
			_listScroll.x=_maskMc.width
			_listScroll.y=0;
			_allCell.mask=_maskMc;
		}


		public function get maskMc():Sprite
		{
			return _maskMc;
		}

		private function addMaskMc():void
		{
			_maskMc=new Sprite;
			addChild(_maskMc);
			_maskMc.graphics.beginFill(0xcccccc, 0.5);
			_maskMc.graphics.drawRect(0, 0, 225, 320);
			_maskMc.graphics.endFill();
		}

		public function del_folder():void
		{
			var deleId:uint=0;
			for (var j:int=0; j < _modelItem.length; j++)
			{
				var vo:ModelVO=_modelItem[j];
				if (vo.select)
				{
					deleId=vo.id;
				}
			}
			if (deleId == 0)
				return;
			//找到要删除的所有。
			for (var i:int=0; i < _modelItem.length; i++)
			{
				var tempModelVo:ModelVO=_modelItem[i];
				tempModelVo.willdele=isItSon(tempModelVo.id, deleId);
				if (tempModelVo.id == deleId)
				{ //自己也要删除
					tempModelVo.willdele=true;
				}
			}
			for (var k:int=0; k < _modelItem.length; k++)
			{
				var tempVo:ModelVO=_modelItem[k];
				if (tempVo.willdele)
				{
					_modelItem.splice(k, 1);
					_allCell.removeChild(tempVo.cell);
					k--
				}
			}
			changePasition();
		}

		public function add_folder():void
		{
			//找到当前所选
			var newFolderId:uint=0;
			for (var j:int=0; j < _modelItem.length; j++)
			{
				var vo:ModelVO=_modelItem[j];
				if (vo.select)
				{
					if (vo.filetype == 1)
					{
						newFolderId=vo.id;
						vo.open=true; //打开看起来舒服一点
					}
					else
					{
						newFolderId=vo.father;
					}
				}
			}
			var tempModelVo:ModelVO=new ModelVO;
			tempModelVo.name="newFolder";
			tempModelVo.id=getRandomNewId();
			tempModelVo.open=false;
			tempModelVo.filetype=1;
			tempModelVo.father=newFolderId;
			tempModelVo.bh=DataType.NUM25

			var tempCell:Cell=new Cell;
			tempCell.source=tempModelVo;
			tempModelVo.cell=tempCell;
			_modelItem.push(tempModelVo)
			_allCell.addChild(tempCell);
			changePasition();

		}

		private function getRandomNewId():uint
		{
			var newid:uint //保证不重复
			while (true)
			{
				newid=uint(Math.random() * 900000 + 100000);
				for (var j:int=0; j < _modelItem.length; j++)
				{
					var tempModelVo:ModelVO=_modelItem[j];
					if (tempModelVo.id == newid)
					{
						newid=0;
					}
				}
				if (newid != 0)
				{
					break;
				}
			}
			return newid
		}

		public function setMoveAllCellAphal(fatherId:uint):void
		{
			for (var j:int=0; j < _modelItem.length; j++)
			{
				var tempModelVo:ModelVO=_modelItem[j];
				if (tempModelVo.father == fatherId || tempModelVo.id == fatherId)
				{
					tempModelVo.cell.alpha=0.5
				}
				else
				{
					tempModelVo.cell.alpha=isItSon(tempModelVo.father, fatherId) ? 0.5 : 1
				}
			}
		}

		public function isItSon(id:uint, fatherId:uint):Boolean
		{
			for (var j:int=0; j < _modelItem.length; j++)
			{
				var tempModelVo:ModelVO=_modelItem[j];
				if (tempModelVo.id == id)
				{
					if (tempModelVo.father == 0)
					{
						return false;
					}
					else if (tempModelVo.father == fatherId)
					{
						return true;
					}
					else
					{
						return isItSon(tempModelVo.father, fatherId);
					}
				}
			}
			return false;
		}

		public function isItSonAndCamMove(id:uint, fatherId:uint):Boolean
		{ //测试是否是可移到的位置，对比他们的关系
			if (fatherId == 0)
			{
				return true;
			}

			for (var j:int=0; j < _modelItem.length; j++)
			{
				var tempModelVo:ModelVO=_modelItem[j];
				if (tempModelVo.id == fatherId)
				{
					if (tempModelVo.father == 0)
					{
						return true;
					}
					else if (tempModelVo.father == id)
					{
						return false
					}
					else
					{
						return isItSonAndCamMove(id, tempModelVo.father);
					}
				}
			}
			return true;
		}

		public function get allCell():Sprite
		{
			return _allCell;
		}

		public function source(item:Array):void
		{
			_modelItem=item;
			while (_allCell.numChildren > 0)
			{
				_allCell.removeChildAt(0);
			}

			for (var i:int=0; i < item.length; i++)
			{
				var tempModelVo:ModelVO=item[i];
				var tempCell:Cell=new Cell;
				tempCell.source=tempModelVo;
				tempModelVo.cell=tempCell;
				_allCell.addChild(tempCell);
			}
			changePasition();
		}

		private function refurbish():void
		{
			for (var i:int=0; i < _modelItem.length; i++)
			{
				var tempModelVo:ModelVO=_modelItem[i];
				tempModelVo.cell.setSate();
			}
		}

		public function changePasition():void
		{
			testHaveSon();
			mathCellHeight();
			moveCellPosition(0);
			hideCell();
			refurbish();

			_listScroll.changeSize();

		}

		private function testHaveSon():void
		{
			for (var i:int=0; i < _modelItem.length; i++)
			{
				var tempModelVo:ModelVO=_modelItem[i];
				tempModelVo.haveson=false;
				for (var j:int=0; j < _modelItem.length; j++)
				{
					var vo:ModelVO=_modelItem[j];
					if (vo.father == tempModelVo.id)
					{
						tempModelVo.haveson=true;
					}
				}
			}
		}

		public function selectCell(selectId:uint):void
		{
			for (var j:int=0; j < _modelItem.length; j++)
			{
				var tempModelVo:ModelVO=_modelItem[j];
				if (tempModelVo.id == selectId)
				{
					tempModelVo.select=true;
				}
				else
				{
					tempModelVo.select=false;
				}
				tempModelVo.cell.setSate();
			}
		}

		private function hideCell():void
		{
			for (var j:int=0; j < _modelItem.length; j++)
			{
				var tempModelVo:ModelVO=_modelItem[j];
				tempModelVo.cell.visible=getFatherHide(tempModelVo.father);
			}
		}

		private function getFatherHide(fatherId:uint):Boolean
		{
			for (var j:int=0; j < _modelItem.length; j++)
			{
				var tempModelVo:ModelVO=_modelItem[j];

				if (tempModelVo.id == fatherId)
				{
					if (!tempModelVo.open)
					{
						return false;
					}
					else
					{
						return getFatherHide(tempModelVo.father);
					}
				}
			}
			return true;
		}

		private function getFatheBasex(fatherId:uint):Number
		{
			for (var j:int=0; j < _modelItem.length; j++)
			{
				var tempModelVo:ModelVO=_modelItem[j];
				if (tempModelVo.id == fatherId)
				{
					return tempModelVo.bx + 20;
				}
			}
			return 0;
		}

		private function getFatheBasey(fatherId:uint):Number
		{
			for (var j:int=0; j < _modelItem.length; j++)
			{
				var tempModelVo:ModelVO=_modelItem[j];
				if (tempModelVo.id == fatherId)
				{
					return tempModelVo.by + 25;
				}
			}
			return 0;
		}

		private function moveCellPosition(fatherId:uint):void
		{
			var by:Number=getFatheBasey(fatherId);
			var bx:Number=getFatheBasex(fatherId);
			for (var j:int=0; j < _modelItem.length; j++)
			{
				var tempModelVo:ModelVO=_modelItem[j];
				if (tempModelVo.father == fatherId)
				{
					tempModelVo.bx=bx;
					tempModelVo.by=by;
					tempModelVo.cell.x=bx;
					tempModelVo.cell.y=by;
					by=by + tempModelVo.bh
					moveCellPosition(tempModelVo.id)
				}
			}
		}

		private function getSonHeight(fatherId:uint):uint
		{
			var h:uint=DataType.NUM25;
			for (var j:int=0; j < _modelItem.length; j++)
			{
				var tempModelVo:ModelVO=_modelItem[j];
				if (tempModelVo.father == fatherId)
				{
					if (tempModelVo.open)
					{
						h=h + getSonHeight(tempModelVo.id);
					}
					else
					{
						h=h + DataType.NUM25
					}
				}
			}
			return h;
		}

		private function mathCellHeight():void
		{
			for (var i:int=0; i < _modelItem.length; i++)
			{
				var tempModelVo:ModelVO=_modelItem[i];
				if (tempModelVo.open)
				{
					tempModelVo.bh=getSonHeight(tempModelVo.id);
				}
				else
				{
					tempModelVo.bh=DataType.NUM25;
				}
			}
		}

	}
}
